Argentina
Mapa del sitio  | Home | Worldwide
Microsoft
Buscar en Microsoft.com:
Ayuda y Soporte Técnico  
| Seleccione un producto | Búsqueda Avanzada | Grupos de noticias | Contáctenos

PRB: ExitWindowsEx API no reinicia Windows NT

AVISO: Gracias por utilizar el servicio de Traducción Automática. Este artículo ha sido traducido por un sistema informático sin ayuda humana (Machine Translation). Microsoft ofrece estos artículos a los usuarios que no comprendan el inglés, exclusivamente, con el fin de que puedan entenderlos más fácilmente. Microsoft no se hace responsable de la calidad lingüística de las traducciones ni de la calidad técnica de los contenidos de los artículos así como tampoco de cualesquiera problemas, directos o indirectos, que pudieran surgir como consecuencia de su utilización por los lectores.
Id. de artículo : 176695
Última revisión : jueves, 24 de junio de 2004
Versión : 3.0
En esta página

Síntomas

Cuando utiliza el API de ExitWindowsEx para reiniciar el sistema en Windows NT y Windows 2000, no se reinicia el equipo.

Volver al principio

Causa

Para reiniciar un sistema Windows NT o Windows 2000 mediante programación, el proceso requiere el privilegio SE_SHUTDOWN_NAME. Las aplicaciones de Visual Basic no disponen de este privilegio y por tanto, de forma predeterminada, no reiniciarán el equipo.

Volver al principio

Solución

Para obtener a API de ExitWindowsEx que reinicie el sistema en Windows NT o Windows 2000, se debe establecer el privilegio SE_SHUTDOWN_NAME. Los pasos siguientes describen cómo obtener al API de ExitWindowsEx que funcione en Windows NT y Windows 2000.

Volver al principio

Ejemplo paso a paso

1. Cree un EXE estándar nuevo en Visual Basic. Se creará Form1 de manera predeterminada
2. Vea el código de Form1. En la sección de Declaraciones, agregue el código siguiente:
      Private Type LUID
         UsedPart As Long
         IgnoredForNowHigh32BitPart As Long
      End Type

      Private Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        TheLuid As LUID
        Attributes As Long
      End Type

      Private Const EWX_SHUTDOWN As Long = 1
      Private Const EWX_FORCE As Long = 4
      Private Const EWX_REBOOT = 2

      Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
           dwOptions As Long, ByVal dwReserved As Long) As Long

      Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
      Private Declare Function OpenProcessToken Lib "advapi32" (ByVal _
         ProcessHandle As Long, _
         ByVal DesiredAccess As Long, TokenHandle As Long) As Long
      Private Declare Function LookupPrivilegeValue Lib "advapi32" _
         Alias "LookupPrivilegeValueA" _
         (ByVal lpSystemName As String, ByVal lpName As String, lpLuid _
         As LUID) As Long
      Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
         (ByVal TokenHandle As Long, _
         ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES _
         , ByVal BufferLength As Long, _
      PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

					
3. Agregue un procedimiento llamado a AdjustToken con el código siguiente:
      Private Sub AdjustToken()
         Const TOKEN_ADJUST_PRIVILEGES = &H20
         Const TOKEN_QUERY = &H8
         Const SE_PRIVILEGE_ENABLED = &H2
         Dim hdlProcessHandle As Long
         Dim hdlTokenHandle As Long
         Dim tmpLuid As LUID
         Dim tkp As TOKEN_PRIVILEGES
         Dim tkpNewButIgnored As TOKEN_PRIVILEGES
         Dim lBufferNeeded As Long

         hdlProcessHandle = GetCurrentProcess()
         OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
            TOKEN_QUERY), hdlTokenHandle

      ' Get the LUID for shutdown privilege.
         LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid

         tkp.PrivilegeCount = 1    ' One privilege to set
         tkp.TheLuid = tmpLuid
         tkp.Attributes = SE_PRIVILEGE_ENABLED

     ' Enable the shutdown privilege in the access token of this process.
         AdjustTokenPrivileges hdlTokenHandle, False, _
         tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded

     End Sub

					
4. Agregue un CommandButton al formulario. En el evento Click, agregue el código siguiente:
      Private Sub Command1_Click()
         AdjustToken
         ExitWindowsEx (EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF
      End Sub

					
5. Guarde el proyecto y genere una ejecutable. Cuando ejecuta el ejecutable y hace clic en el control CommandButton, el equipo se reiniciará como se espera.

Volver al principio

Estado

Esta característica de diseño es el comportamiento.

Volver al principio

Referencias

Para información adicional, consulte los artículos siguientes en el Microsoft Knowledge Base:
142820 (http://support.microsoft.com/kb/142820/EN-US/) HOWTO: Termine Windows desde una aplicación VB de 16 bits

76981 (http://support.microsoft.com/kb/76981/EN-US/) VB3 HOWTO: Termina Windows desde una aplicación de Visual Basic

168796 (http://support.microsoft.com/kb/168796/EN-US/) HOWTO: Reinicie mediante programación en un equipo o cierre la sesión en un equipo

Volver al principio


La información de este artículo se refiere a:
Microsoft Visual Basic 5.0 Learning Edition
Microsoft Visual Basic 6.0 Learning Edition
Microsoft Visual Basic 5.0 Professional Edition
Microsoft Visual Basic 6.0 Professional Edition
Microsoft Visual Basic 5.0 Enterprise Edition
Microsoft Visual Basic 6.0 Enterprise Edition
Microsoft Visual Basic 4.0 Standard Edition
Microsoft Visual Basic 4.0 Professional Edition
Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

Volver al principio

Palabras clave: 
kb32bitonly kbprb KB176695 KbMtes kbmt

Volver al principio

 

Buscar en

 
Búsqueda Avanzada

Seleccione idioma

 

Más soporte técnico

Herramientas


©2007 Microsoft Corporation. Todos los derechos reservados. Aviso legal |Marcas registradas |Privacidad